
/**
 * Effect การแสดงและซ่อน Popup
 */
var effect = 'fold'; // bounce, slide, fold, fade, ...

// option สำหรับ date picker
var datepicker_options = {
    minDate: new Date(),
    changeMonth: true,
    changeYear: true,
    dateFormat: 'dd/mm/yy'
}

var datepicker_search_options = {
    minDate: null,
    dateFormat: 'yy-mm-dd',
    changeMonth: true,
    changeYear: true
};

var dialog_options = {
    bgiframe: true,
    autoOpen: true,
    show: effect,
    hide: effect,
    modal: true,
    title: 'VMI says',
    overlay: {
        backgroundColor: '#000',
        opacity: 0.3
    }
};

var tab_options = {
    cookie: {
        expires: 1
    },
    ajaxOptions: {
        beforeSend: function(request) {
            $j('#indicator').fadeIn();
        },
        complete: function(request) {
            $j('#indicator').fadeOut();
        }
    },
    //            fx: { opacity: 'toggle', duration: 'fast'},
    cache: true
};

/** Overide confirm dialog ถ้า ok ให้ไปเรียก การทำงานตาม url ที่ระบุ
 * @param url        url ที่ต้องการเรียกทำงาน
 * @param update     element id ที่ต้องการรับ response
 * @param message    ข้อความที่ต้องการให้แสดง
 */
function confirm(url, update, message) {
    callback = function() {
        $j('#indicator').show();
        $j('#' + update).load(url, function() {
            $j('#indicator').hide();
        });
    }

    confirmCallBack(message, callback);
}

/**
 * Overide confirm dialog ถ้า ok ให้ไปเรียก การทำงานตาม callback ที่ระบุ
 */
function confirmCallBack(message, callback) {
    $j('#content').after(
        $j('<div id="flash-alert"></div>').append(
            $j("<div class='question flash'></div>").append(
                $j("<img src='" + base + "/img/icon/question.png' />")
                ).append(
                $j('<span>' + message + '</span>')
                )
            )
        );

    $j.flashalert({
        callback: callback,
        cancel: true
    });
}

function alert(message) {
    $j('#content').after(
        $j('<div id="flash-alert"></div>').append(
            $j("<div class='information flash'></div>").append(
                $j("<img src='" + base + "/img/icon/information.png' />")
                ).append(
                $j('<span>' + message + '</span>')
                )
            )
        );
    $j.flashalert();
}

partNoKeyPress = function(event) {
    if (event.keyCode == 13) {// key enter
        Event.element(event).blur();
        Event.stop(event);
    }
}

stopKeyEnter = function(event) {
    if (event.keyCode == 13) {// key enter
        Event.stop(event);
    }
}

requestOptions = function(controller, sourceId, targetSelectId, empty_option, action, callback) {
    var targetSelect = $(targetSelectId);
    var length = targetSelect.options.length;
    for (var i = 0; i < length; i++) {
        targetSelect.remove(0);
    }
    if (empty_option == null) {
        empty_option = true;
    }

    if (action == null) {
        action = 'option_list';
    }

    var url = base + "/" + controller + "/" + action + "/" + $F(sourceId) + '/empty_option:' + empty_option;
    new Ajax.Updater(targetSelectId, url, {
        onComplete: function(request, json) {
            Element.hide('indicator');
            if (callback != null) {
                callback();
            }
        },
        onLoading: function(request) {
            Element.show('indicator');
        },
        requestHeaders:['X-Update', 'content']
    });
}

/**
 * request json by id
 */
requestJSON = function(controller, id, callback) {
    var url = base + "/" + controller + "/json_find_by_id/";
    url += id;
    new Ajax.Request(url, {
        onLoading: function() {
            Element.show('indicator');
        },
        onComplete: function(request) {
            Element.hide('indicator');

            var json = eval("(" + request.responseText + ")");
            callback(json);
        },
        requestHeaders:['X-Update', 'content']
    });
}

/**
 * request โดยส่ง parameters แบบ POST
 */
postRequest = function(url, p, callback) {
    var keys = Object.keys(p);
    var params = {};
    // จัด format parameter ใหม่ให้อยู่ในรูป data["key"]
    keys.each(function(key) {
        params["data[" + key + "]"] = p[key];
    });
    new Ajax.Request(url, {
        parameters: params,
        onLoading: function(request) {
            Element.show('indicator');
        },
        onComplete: function(request) {
            Element.hide('indicator');
            var json = eval("(" + request.responseText + ")");
            callback(json);
        },
        requestHeaders:['X-Update', 'content']
    });
}

requestUpdater = function(content, url) {
    url = base + '/' + url;
    new Ajax.Updater(content, url, {
        asynchronous:true,
        evalScripts:true,
        onComplete:function(request, json) {
            Element.hide('indicator');
        },
        onLoading:function(request) {
            Element.show('indicator');
        },
        requestHeaders:['X-Update', 'content']
    });
}

requestPopup = function(url, callback, oncomplete) {
    if (callback != null) {
        url = url + "/callback:" + callback;
    }
    new Ajax.Updater('content', url, {
        asynchronous:true,
        evalScripts:true,
        onComplete:function(request, json) {
            Element.hide('indicator');
            if (oncomplete != null) {
                oncomplete();
            }
        },
        onLoading:function(request) {
            Element.show('indicator');
        },
        requestHeaders:['X-Update', 'content'],
        insertion: "bottom"
    });
}

function initPopUpIndex(row) {
    $j("#popupIndex" + row).dialog($j.extend({}, dialog_options, {
        autoOpen: false,
        width: 800,
        position: "center",
        close: function() {
            $("tdIndex" + row).insert($("Index" + row));
            $("Index" + row).hide();
        }
    }));
}

function popupIndex(row) {
    $("popupIndex" + row).update($("Index" + row));
    $("Index" + row).show();
    $j("#popupIndex" + row).dialog("option", "position", "center");
    $j("#popupIndex" + row).dialog("open");
}

/**
 * Extend method ของ jQuery Wrapper
 * Element ที่เรียกด้วย $j()
 */
(function($j){
    /**
     * เอาเมาส์วางเหนือ element แล้วเปลี่ยนเป็นรูปมือ
     */
    $j.fn.handover = function(option){
        return $j(this).bind('mouseover mouseout', function() {
            $j(this).toggleClass('handover');
            if (option != null && (typeof option.highlight == "string")) {
                $j(this).parent(option.highlight).toggleClass('inplace-hightlight');
            }
        });
    }
    /**
     * เอาเมาส์วางเหนือ element แล้วมีแถบสี
     */
    $j.fn.hightlight = function(){
        return $j(this).bind('mouseover mouseout', function() {
            $j(this).toggleClass('hightlight')
        });
    }

    /**
     * แทน prototype Ajax.Updater
     */
    $j.fn.update = function(url, callback){
        $j('#indicator').show();
        $j(this).load(url, function(data) {
            if (callback != null) {
                callback(data);
            }
            $j('#indicator').hide();
        });
    }

    /**
     * แทน prototype Ajax.Updater
     */
    $j.fn.popup = function(){
        $j(this).bind('click', function() {
            var url = $j(this).attr('href');
            $j('#indicator').show();
            $j.get(url, function(data) {
                $j('#content').after(data);
                $j('#indicator').hide();
            });
        })
    }

    /**
     * แทน prototype requestOptions
     * ดึง option ใน select มาใส่ element ที่ระบุ
     * option[callback]
     * option[empty_option]
     */
    $j.fn.requestOptions = function(url, source_id, option) {
        url = base + '/' + url;
        if (typeof option == 'undefined') {
            option = {};
        }

        if (typeof option.callback == "undefined") {
            option.callback = function(){ };
        }

        var emptyOption
        if (typeof option.empty_option == 'string') {
            emptyOption = option.empty_option;
        } else if (typeof option.empty_option == 'boolean') {
            emptyOption = (option.empty_option == true? 'true': 'false');
        } else {
            emptyOption = 'true';
        }

        // ถ้าค่าเงื่อนไขเข้ามาเป็นค่าว่าง (เลือก option ว่าง)
        if (source_id == '') {
            $j(this).empty().append('<option value=""></option>');
            return $j(this);
        } else {
            url += '/' + source_id;
        }


        url += '/empty_option:' + emptyOption;

        $j('#indicator').show();
        $j(this).load(url, function() {
            option.callback();
            $j('#indicator').hide();

        });

        return $j(this);
    }

    /**
     * จัดเรียงลำดับตัวเลขในแถวตารางใหม่ จาก id tbody ที่ระบุ
     */
    $j.fn.runno = function() {
        $j(this).children().find('td:first:child').each(function (i) {
            // this คือ td คอลัมภ์แรกในแต่ละแถว
            $j(this).text(i + 1);
            // highlight สีแถวใหม่ตามลำดับเลข
            $j(this).parents('tr').removeClass().addClass(i % 2 == 0? 'even-cell': 'odd-cell');
        })
    }

    /**
     * validate field ว่าเป็นค่าว่างหรือไม่
     */
    $j.fn.isEmpty = function() {
        return $j.trim($j(this).val()) == '';
    }

    /**
     * extend form object to check beforesubmit
     */
    var beforeSubmits = {};
    $j.fn.beforeSubmit = function(arg) {
        // ถ้าใส่ function เข้ามาแสดงว่าให้ add ใน list เพิ่ม
        if (typeof arg == 'function') {
            beforeSubmits[$j(this).attr('id')] = arg;
        } else {
            // ถ้าไม่ได้ใส่อะไรมา ให้ call before submit ตาม object form
            return beforeSubmits[$j(this).attr('id')]();
        }
        return false;
    }

    /**
     * ส้างปฏิทิน search ที่ต่อท้าย id ด้วย Start และ End
     */
    $j.datesearchpicker = function(id) {
        $j(id + 'Start').datepicker($j.extend(datepicker_search_options, {
            onSelect: function(dateText) {
                $j(id + 'End').removeAttr('disabled').val(dateText);
            }
        })).val('');
        $j(id + 'End').datepicker(datepicker_search_options).attr('disabled', true).val('');
    }

    /**
     * event ที่เกี่ยวกับการ search field ที่เป็น BETWEEN AND
     */
    $j.betweensearchpicker = function(id) {
        $j(id + "Start").bind('change', function() {
            $j(id + "End").removeAttr('disabled').val($j(this).val()).focus();;
        });
        $j(id + "End").attr('disabled', true);
    }

    /**
     * แสดง popup การ validate ข้อมูลไม่ผ่าน
     * id element ที่ต้องการให้ focus เวลากด ok เสร็จจาก alert
     */
    $j.flashalert = function(options) {
        if (typeof options == 'undefined') {
            options = {};
        }

        // flag ไว้เช็คว่า เคยกด ok แล้วหรือยัง (กันกรณีเครื่องช้ามาก กด ok 2 ครั้งทำให้ run callback 2 ครั้ง)
        var isOkClicked = false;
        var buttons = {
            Ok: function() {
                $j('#flash-alert').dialog('close');

                // ถ้ามี callback และ confirm นี้ ยังไม่เคยกด ok เรียก callback
                if (options.callback != null && isOkClicked == false) {
                    options.callback();
                }
                isOkClicked = true;
            }
        };
        if (options.cancel != null && options.cancel == true) {
            buttons.Cancel = function() {
                $j('#flash-alert').dialog('close');
            };
        }

        $j("#flash-alert").dialog(Object.extend(Object.clone(dialog_options), {
            resizable: false,
            buttons: buttons,
            close: function() {
                $j(this).dialog('destroy');
                $j(this).remove();

                if (options.focus != null) {
                    $j('#' + options.focus).focus();

                    // ถ้าไม่ใช่ field ที่เป็นวันที่ให้ select (แถบดำ) ด้วยเลย
                    if (options.focus.indexOf('Date') < 0) {
                        $j('#' + options.focus).select();
                    }

                }
            }
        }));
        $j('#flash-alert').show();
    }

    /**
     * สร้าง element ที่จำเป็นและทำการเรียน popup
     */
    $j.failflash = function(title, message, focus) {
        $j('#content').after(
            $j('<div id="flash-alert"></div>').append(
                $j("<div class='fail flash'></div>").append(
                    $j("<img src='" + base + "/img/icon/fail.png' />")
                    ).append(
                    $j('<span>' + title + '</span>')
                    )
                ).append(
                message == null? '': $j('<div class="ui-widget-content ui-corner-all" style="margin-top: 1em;"></div>').append(
                    $j('<div class="error-message">' + message + '</div>')
                    )
                )
            );
        $j.flashalert({
            focus: focus
        });
    }

    /**
     * เช็ค field ที่ระบุเข้ามาเป็น parameter ทั้งหมด ว่าใส่ข้อมูลเข้ามาหรือยัง
     * ระบุมาเป็น ID และจะแสดง alert message ตาม label for "id" ของ field ที่ระบุ
     */
    $j.areEmpty = function() {
        var count = arguments.length;
        for (var i = 0; i < count; i++) {
            if ($j('#' + arguments[i]).isEmpty()) {
                $j.failflash('Please specify <span class="block">"' + $j('label[for=' + arguments[i] + ']').filter(':first').text() + '"</span>', null, arguments[i]);
                return true;
            }
        }
        return false;
    }

    /**
     * เช็ค field ที่ระบุเข้ามาเป็น parameter ทั้งหมด ว่าใส่ข้อมูลเข้ามาหรือยัง
     * ระบุมาเป็น ID และจะแสดง alert message ตาม label for "id" ของ field ที่ระบุ
     */
    $j.validateField = function(id, text, focus) {
        if ($j('#' + id).isEmpty()) {
            $j.failflash('Please specify <span class="block">"' + text + '"</span>', null, focus);
            return false;
        }
        return true;
    }

    /**
     * เช็ค แถวในตารางตาม field ที่ระบุเข้ามาเป็น parameter ทั้งหมด ว่าใส่ข้อมูลเข้ามาหรือยัง
     * ระบุมาเป็น ID และจะแสดง alert message ตาม label for "id" ของ field ที่ระบุ
     * สามารถระบุ function ที่ใช้ในการตรวจสอบได้
     */
    $j.validateColumns = function(id, text, options) {
        if (options == null) {
            options = {};
        }

        var lines;
        if (options.checkLast == true) {
            lines = $j(':input[id$=' + id + ']:visible');
        } else {
            lines = $j(':input[id$=' + id + ']:visible').not(':last');
        }

        var count = lines.length;
        for (var i = 0; i < count; i++) {
            if (options.callback != null) {
                if (!options.callback($j(lines[i]).val())) {
                    $j.failflash('Please specify <span class="block">"' + text + '"</span>', null, $j(lines[i]).attr('id'));
                    return false;
                }
            } else {
                if ($j(lines[i]).val() <= 0) {
                    $j.failflash('Please specify <span class="block">"' + text + '"</span>', null, $j(lines[i]).attr('id'));
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * function ที่จะส่งเป็น options ให้ validateColumns
     * ใส่มาเป็นจำนวนเต็มบวกเท่านั้น
     */
    $j.QTY = function (val) {
        // ถ้าค่าน้อยกว่า 0 หรือ หาร 1 ไม่ลงตัว
        if (val <= 0 || (val % 1 != 0)) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * function ที่จะส่งเป็น options ให้ validateColumns
     * ใส่มาเป็นจำนวนเงิน มีทศนิยมได้ เลขบวกเท่านั้น
     */
    $j.AMOUNT = function(val) {
        // ถ้าค่าน้อยกว่า 0
        if (val <= 0) {
            return false;
        } else {
            return true;
        }
    }

    $j.PERCENT = function (val) {
        if (val > 100 || val < 0) {
            return false;
        } else {
            return true;
        }
    }

    $j.EMPTY = function(val) {
        if (val == '') {
            return false;
        } else {
            return true;
        }
    }

})(jQuery);

var editor;
function ckeditor( div ){
    editor = CKEDITOR.replace( div );
}

/**
 * callback function สำหรับ validate field
 */
percentageNumber = function (val) {
    if (val > 100) {
        return false;
    } else {
        return true;
    }
}

/**
 * Google Analytic
 */
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-23938773-3']);
_gaq.push(['_trackPageview']);

(function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
})();
